package TUILayer;

/**
 *
 * @author (GP3 Project Solutions)
 * @version (07-06-2011 JSM: Oprettelse af klasse)
 */

import ControlLayer.*;
import ExceptionsPakke.*;
import java.util.Scanner;

public class LagerUI {
    
//Instans variabler
private Scanner reader;
private VareKatalogCtrl vareKatalogCtrl;
private int updateChoise = 0;
    
    /**
    * Konstruktør for klassen LagerUI
    */
    public LagerUI()
    {
        reader = new Scanner(System.in);
        vareKatalogCtrl = new VareKatalogCtrl();
    }
    
    /**
     * Kalder startmetode med henblik på at generere menu
     */
    public void start()
    {
        lagerMenu();
    }
    
    /**
     * Kalder menuen for lager og starter valgt metode
     */
    public void lagerMenu()
    {
       boolean exit = false;
       while(!exit)//that is: while exit is false
       {
          int choise = udskrivLagerMenu(); 
          switch (choise)
          {   
              case 1: opretVareBeskrivelse();
                      break;    
              case 2: tilfoejVare();
                      break;
              case 3: findVareBeskrivelse();
                      break;
              case 4: opdaterMenu();
                      break;
              case 5: opdaterAntal();
                      break;
              default: exit = true;
                      break;
          }
       }
    }
    
    /**
     * Genererer menuen for lager
     */
    public int udskrivLagerMenu()
    {      // makes an object keyboard to read input from the screen
          
            System.out.println(" *** Lager Menu ***");
            System.out.println(" (1) Opret Varebeskrivelse");
            System.out.println(" (2) Tilføj Vare");
            System.out.println(" (3) Find varebeskrivelse");
            System.out.println(" (4) Opdater varebeskrivelse");
            System.out.println(" (5) Nedskriv antal");
            System.out.println(" (7) Retur");
            System.out.print("\n Foretag valg: ");
            
            int choise = reader.nextInt();
            //System.out.println("\f");
            return choise;
    }
    
    /**
     * Kalder menu for opdatering af leverandørdata
     */
    public void opdaterMenu()
    {
       boolean exit = false;
       while(!exit)
       {
          updateChoise = udskrivOpdaterVareBeskrivelseMenu(); 
          if(updateChoise != 6)
          {
                opdaterVareBeskrivelse(); 
          }
          else
          {
            exit = true;
            //System.out.println("\f");
          }
       }
    }
    
    /**
     * Genererer menu for opdatering af leverandørdata
     */
    public int udskrivOpdaterVareBeskrivelseMenu()
    {      
            System.out.println(" *** Opdater varebeskrivelse Menu ***");
            System.out.println(" (1) Opdater varens beskrivelse");
            System.out.println(" (2) Opdater varens navn");
            System.out.println(" (3) Opdater varens pris");
            System.out.println(" (4) Opdater varens lokation");
            System.out.println(" (5) Opdater alle varedata");
            System.out.println(" (6) Retur");
            System.out.print("\n Foretag valg: ");
            
            updateChoise = reader.nextInt();
            return updateChoise;
     }
    
    /**
     * Metoden indlæser en vares beskrivelse og returnerer beskrivelsen
     * @return name Varens beskrivelse
     */
    public String inputBeskrivelse()
    {
        System.out.println(" Skriv varens beskrivelse: ");
        String name = reader.nextLine();
        name = reader.nextLine();
        return name;
    }
    
    /**
     * Metoden indlæser en leverandørs id og returnerer id
     * @return id Varens identifikationsnummer
     */
    public int inputLeverandoerId()
    {   
        boolean ok = false;
        int id = 0;
        while(!ok)
        {
           System.out.println(" Skriv leverandoerens Id:  ");
           try{
             id = reader.nextInt();
             ok = true;
           }
           catch (Exception e)
            {
             System.out.println("Der skal indtastes et tal -  prøv igen");
             String input = reader.nextLine();
           }
        }
        return id;
    }
    
    /**
     * Metoden indlæser en leverandørs navn og returnerer navnet
     * @return name Leverandørens navn
     */
    public String inputLeverandoer()
    {
        System.out.println(" Skriv leverandørens navn: ");
        String name = reader.nextLine();
        name = reader.nextLine();
        return name;
    }
    
    /**
     * Metoden indlæser en vares id og returnerer id
     * @return id Varens identifikationsnummer
     */
    public int inputVareId()
    {   
        boolean ok = false;
        int id = 0;
        while(!ok)
        {
           System.out.println(" Skriv varens Id:  ");
           try{
             id = reader.nextInt();
             ok = true;
           }
           catch (Exception e)
            {
             System.out.println("Der skal indtastes et tal -  prøv igen");
             String input = reader.nextLine();
           }
        }
        return id;
    }
    
    /**
     * Metoden indlæser en vares navn og returnerer navnet
     * @return name Varens beskrivelse
     */
    public String inputNavn()
    {
        System.out.println(" Skriv varens navn: ");
        String name = reader.nextLine();
        name = reader.nextLine();
        return name;
    }
    
    /**
     * Metoden indlæser en vares pris og returnerer pris
     * @return pris Varens pris
     */
    public int inputPris()
    {   
        boolean ok = false;
        int pris = 0;
        while(!ok)
        {  
           System.out.println(" Skriv varens pris:  ");
           try{
             pris = reader.nextInt();
             ok = true;
           }
           catch (Exception e)
            {
             System.out.println("Der skal indtastes et tal -  prøv igen");
             String input = reader.nextLine();
           }
        }
        return pris;
    }
    
    /**
     * Metoden indlæser hvor varen er placeret på lageret og returnerer lokation
     * @return lokation Varens beskrivelse
     */
    public String inputLokation()
    {
        System.out.println(" Skriv hvor varen skal placeres: ");
        String lokation = reader.nextLine();
        lokation = reader.nextLine();
        return lokation;
    }
    
    /**
     * Metoden indlæser en vares tilbudspris og returnerer tilbudspris
     * @return pris Varens tilbudspris
     */
    public int inputTilbudsPris()
    {   
        boolean ok = false;
        int pris = 0;
        while(!ok)
        {
           System.out.println(" Skriv varens tilbudspris:  ");
           try{
             pris = reader.nextInt();
             ok = true;
           }
           catch (Exception e)
            {
             System.out.println("Der skal indtastes et tal -  prøv igen");
             String input = reader.nextLine();
           }
        }
        return pris;
    }
    
    /**
     * Metoden indlæser hvor meget en vare på lageret skal opdateres med og returnerer antal
     * @return antal Det antal en vare på lageret skal opdateres med
     */
    public int inputAntal()
    {   
        boolean ok = false;
        int antal = 0;
        while(!ok)
        {  
           System.out.println(" Skriv antal:  ");
           try{
             antal = reader.nextInt();
             ok = true;
           }
           catch (Exception e)
            {
             System.out.println("Der skal indtastes et tal -  prøv igen");
             String input = reader.nextLine();
           }
        }
        return antal;
    }
    
    /**
     * Metoden kalder opretVareBeskrivelse i controlleren
     * med brugerspecificerede parametre
     */
    public void opretVareBeskrivelse()
    {
        try
        {
            String beskrivelse = inputBeskrivelse();
            int leverandoerId = inputLeverandoerId();
            String leverandoer = inputLeverandoer();
            int vareId = inputVareId();
            String navn = inputNavn();
            double pris = inputPris();
            String lokation = inputLokation();
            double tilbudsPris = inputTilbudsPris();
            
            vareKatalogCtrl.opretVareBeskrivelse(beskrivelse, leverandoerId, leverandoer, vareId, navn, pris, lokation, tilbudsPris);
        }
        catch(NoSuchLeverandoerIdException e)
        {
            e.toString();
        }
        catch(NullValueException e)
        {
            e.toString();
        }
        catch(NumberFormatException e)
        {
            System.out.println("Et talfelt er tomt eller indeholder tekst!");
        }
        catch(Exception e)
        {
            System.out.println("Tjek for tomme felter");
        }
        
    }
    
    /**
     * Metoden kalder tilfoejVare i controlleren
     * med brugerspecificerede parametre
     */
    public void tilfoejVare()
    {
        int vareId = inputVareId();
        int antal = inputAntal();
        vareKatalogCtrl.tilfoejVare(vareId, antal);
    }
    
    /**
     * Metoden kalder findVareBeskrivelse i controlleren
     * ud fra vareNavn og udskriver varedata
     */
    public void findVareBeskrivelse()
    {
        String vareNavn = inputNavn();
        
        if(vareKatalogCtrl.findVareBeskrivelse(vareNavn) != null)
        {
            System.out.println(vareKatalogCtrl.findVareBeskrivelse(vareNavn));
        }
        else
        {
            System.out.println("Der blev ikke fundet en varebeskrivelse!");
        }
    }
    
    /**
     * Metoden kalder findVareBeskrivelseId i controlleren
     * ud fra vareId og udskriver varedata
     */
    public void findVareBeskrivelseId()
    {
        int vareId = inputVareId();
        
        if(vareKatalogCtrl.findVareBeskrivelseId(vareId) != null)
        {
            System.out.println(vareKatalogCtrl.findVareBeskrivelseId(vareId));
        }
        else
        {
            System.out.println("Der blev ikke fundet en varebeskrivelse!");
        }
    }
    
    /**
     * Metoden kalder opdaterVareBeskrivelse i controlleren
     * med brugerspecificerede parametre
     */
    public void opdaterVareBeskrivelse()
    {
        int id = inputVareId();
        if(vareKatalogCtrl.findVareBeskrivelseId(id) != null)
        {
            String beskrivelse = vareKatalogCtrl.findVareBeskrivelseId(id).hentBeskrivelse();
            String navn = vareKatalogCtrl.findVareBeskrivelseId(id).hentNavn();
            double pris = vareKatalogCtrl.findVareBeskrivelseId(id).hentPris();
            String lokation = vareKatalogCtrl.findVareBeskrivelseId(id).hentLokation();
        
            switch(updateChoise)
            {
                case 1: beskrivelse = inputBeskrivelse();
                        break;
                case 2: navn = inputNavn();
                        break;
                case 3: pris = inputPris();
                        break;
                case 4: lokation = inputLokation();
                        break;
                case 5: beskrivelse = inputBeskrivelse();
                        navn = inputNavn();
                        pris = inputPris();
                        lokation = inputLokation();
                        break;
             }
             vareKatalogCtrl.opdaterVareBeskrivelse(id, beskrivelse, navn, pris, lokation);
             
             System.out.println("\f");
       }
       else
       {
            System.out.println("Ingen varebeskrivelse fundet!");
       }
    }
    
    /**
     * Metoden kalder opdaterAntal i controlleren
     * med brugerspecificerede parametre
     * Overvej at bruge id istedet
     */
    public void opdaterAntal()
    {
        String vareNavn = inputNavn();
        int antal = inputAntal();
        
        try
        {
            vareKatalogCtrl.opdaterAntal(vareNavn, antal);
        }
        catch (Exception e)
        {
            System.out.println("Tjek om du har forsøgt at fjerne flere varer end der er på lageret!");
        }
    } 
}